export class ArrayQueue<T> {
    /**
     * 保存实际数据
     */
    private _arr: T[];

    constructor() {
        this._arr = [];
    }

    /**
     * 实际数据长度
     */
    public get length(): number {
        return this._arr.length;
    }

    /**
     * 获取所有值
     */
    public get values(): T[] {
        return this._arr;
    }

    /**
     * 是否包含
     * @param item 
     * @returns 
     */
    has(item: T): boolean {
        return this._arr.indexOf(item) !== -1;
    }

    /**
     * 入队
     * @param item 
     */
    enqueue(item: T): void {
        this._arr.push(item);
    }

    /**
     * 出队
     * @returns 队首元素或 undefined（如果队列为空）
     */
    dequeue(): T | undefined {
        if (this.isEmpty()) {
            return undefined;
        }
        return this._arr.shift();
    }

    /**
     * 查看队首元素
     * @returns 队首元素或 undefined（如果队列为空）
     */
    peek(): T | undefined {
        if (this.isEmpty()) {
            return undefined;
        }
        return this._arr[0];
    }

    /**
     * 检查队列是否为空
     * @returns 队列是否为空
     */
    isEmpty(): boolean {
        return this._arr.length === 0;
    }
    /**
     * 移除元素
     * @param item 
     */
    remove(item: T) {
        this._arr = this._arr.filter(i => i !== item);
    }
    /**
     * 清空队列
     */
    clear(): void {
        this._arr = [];
    }

    /**
     * 打印队列的内容
     */
    print(): void {
        console.log(this._arr);
    }
}